package com.lpw.dbvideo.login.controller;

import com.lpw.dbvideo.config.WeChatConfig;
import com.lpw.dbvideo.login.service.WeChatService;
import com.lpw.dbvideo.user.domain.User;
import com.lpw.dbvideo.user.service.UserService;
import com.lpw.dbvideo.utils.JWTUtils;
import com.lpw.dbvideo.utils.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * 第一步 用户前端请求进入（本项目中的）接口，接口请求微信平台，微信平台给（本项目中的）接口返回一个授权地址，（本项目中的）接口再给前端返回，前端展示；
 * 第二步 用户前端进行确认（即扫码确认），接着微信平台会重定向到（本项目中的）接口，并且带上一个授权临时票据code；
 * 第三步 根据code加上appid和appsecret 请求微信获取token，微信返回token结束。
 */
@Controller
@RequestMapping("/api/wechat")
public class WeChatController {

    @Autowired
    private WeChatConfig weChatConfig;

    @Autowired
    private WeChatService weChatService;

    /**
     * 微信扫一扫登录,获取微信二维码的地址
     * @param state  用于保持请求和回调的状态，授权请求后原样带回给第三方。该参数可用于防止csrf攻击（跨站请求伪造攻击），建议第三方带上该参数，可设置为简单的随机数加session进行校验
     * @return
     * @throws UnsupportedEncodingException
     */
    @RequestMapping("login")
    @ResponseBody
    public JsonData loginUrl(@RequestParam(value = "state")String state) throws UnsupportedEncodingException {
        String redirecrUrl = weChatConfig.getWxOpenRedirectUrl(); // 获取开放平台重定向地址
        String callBackUrl = URLEncoder.encode(redirecrUrl,"UTF-8"); // 进行编码
        String qrcodeUrl = String.format(WeChatConfig.getOpenQrcodeUrl(),weChatConfig.getWxOpenAppId(),callBackUrl,state);
        return JsonData.success(qrcodeUrl);
    }

    /**
     *  微信客户端的回调接口
     * @param code 用户确认后，微信端重定向会这个接口，带上授权临时票据（code）
     * @param state 上面我们给微信端传的state，微信端会继续返回给我们
     * @param response HttpServletResponse
     */
    @GetMapping("/user/callback")
    public String wechatUserCallBack(String code, String state, HttpServletResponse response) throws IOException {
        User user = weChatService.saveWeChatUser(code);
         // 生成JWT
        if(user != null){
            String token = JWTUtils.geneJsonWebToken(user);
//            response.sendRedirect(state+"?token="+token+"&head_img="+user.getHeadImg()+"&name="+user.getName());
            return "redirect:" + state+"?token="+token+"&head_img="+user.getHeadImg()+"&name="+user.getName();
        }
        return null;
    }

}
